/**
 * Copyright (c) 2016-2019 人人开源 All rights reserved.
 *
 * https://www.renren.io
 *
 * 版权所有，侵权必究！
 */

package com.zgs.mall.order;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.amqp.rabbit.annotation.EnableRabbit;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;

/**
 * 使用RabbitMq
 * 1.引入amoq场景，RabbitAutoConfig就会自动生效
 * 2.给容器中自动配置了
 *   RabbitTemplate、AmqpAdmin、CachingConnectionFactory、RabbitMessagingTemplate
 * 本地事务失效问题：
 * 	同一个对象内事务方法互调默认失效（只会用主方法的事务）原因：绕过了代理对象，事务使用代理对象来控制的
 * 	解决：使用代理对象来调用事务方法
 * 	 1.引入aop-starter；spring-boot-starter-aop引入aspectj
 * 	 2.@EnableAspectJAutoProxy(exposeProxy = true) 开启aspectj动态代理功能，以后所有的动态代理都是aspectj创建的（即使没有接口也可以创建动态代理）
 * 	  对外暴露代理对象
 * 	 3.本类互调用代理对象
 *Seata控制分布式事务
 * 1.每一个微服务先必须创建 undo_log表
 *
 * 3.整合
 * 	1.导入依赖spring-cloud-starter-alibaba-seata seata-all-0.7.1
 * 	2.解压并启动seata-server
 *    registry.cof：注册中心 修改 registry type=nacos
 *	3.所有想要用到分布式事务的微服务使用 seata DataSourceProxy代理
 *	4.每个微服务，都必须导入
 *			registry.conf  file.conf
 *	 5.每个分布式大事务的入口标注@GlobalTransactional
 *	  每个远程小事务使用@Transactional
 */

@EnableAspectJAutoProxy(exposeProxy = true) //aop框架暴露该代理对象，aopContext能够访问.
@EnableFeignClients
@EnableRedisHttpSession
@EnableRabbit//开启Rabbit
@SpringBootApplication
@MapperScan("com.zgs.mall.order.dao")
@EnableDiscoveryClient//开启nacos的服务注册发现
public class MallOrderApplication {

	public static void main(String[] args) {
		SpringApplication.run(MallOrderApplication.class, args);
	}

}